package 栈;
import java.util.*;

/**
 * 该类用于解码字符串，支持重复子字符串的展开。
 * 时间复杂度：O(n)，空间复杂度：O(n)
 */
public class decodeString {
    /**
     * 解码字符串，支持重复子字符串的展开。
     * 该方法使用两个栈来分别存储数字和字符串，通过遍历字符串来解码。
     * @param s 输入的字符串
     * @return 解码后的字符串
     */
    public String decodeStr(String s) {
        ArrayDeque<Integer> numStack = new ArrayDeque<>(); // 创建一个栈来存储数字
        ArrayDeque<String> strStack = new ArrayDeque<>(); // 创建一个栈来存储字符串
        int num = 0; // 初始化数字
        String str = ""; // 初始化字符串
        for(char c : s.toCharArray()) { // 遍历字符串中的每个字符
            if(Character.isDigit(c)) { // 如果是数字
                num = num * 10 + (c - '0'); // 更新数字
            } else if(c == '[') { // 如果是左括号
                numStack.push(num); // 将数字入栈
                strStack.push(str); // 将字符串入栈
                num = 0; // 重置数字
                str = ""; // 重置字符串
            } else if(c == ']') { // 如果是右括号
                int times = numStack.pop(); // 弹出数字
                StringBuilder sb = new StringBuilder(strStack.pop()); // 弹出字符串
                for(int i = 0; i < times; i++) { // 重复字符串
                    sb.append(str); // 追加字符串
                }
                str = sb.toString(); // 更新字符串
            } else { // 如果是其他字符
                str += c; // 追加字符
            }
        }
        return str; // 返回解码后的字符串
    }

    /**
     * 主方法，处理输入并输出结果。
     * 该方法从标准输入读取字符串，并输出解码后的字符串。
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 创建扫描器对象
        String s = sc.nextLine(); // 读取输入的字符串
        decodeString ds = new decodeString(); // 创建对象
        System.out.println(ds.decodeStr(s)); // 输出解码后的字符串
        sc.close(); // 关闭扫描器
    }
}
